package com.wang.springbootinit.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wang.springbootinit.model.dto.GradeQueryDTO;
import com.wang.springbootinit.model.entity.Grade;
import com.wang.springbootinit.model.param.GradeParam;
import com.wang.springbootinit.model.param.GradeUpdateParam;
import com.wang.springbootinit.model.vo.GradeStudentVO;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * 成绩服务接口
 */
public interface GradeService extends IService<Grade> {
    /**
     * 保存成绩信息
     * @param param 成绩参数
     * @return 保存是否成功
     */
    Boolean saveGrade(GradeParam param);

    /**
     * 更新成绩信息
     * @param id 成绩ID
     * @param grade 成绩信息
     * @return 更新后的成绩信息
     */
    Grade updateGrade(Long id, Grade grade);

    /**
     * 删除成绩信息
     * @param id 成绩ID
     */
    void deleteGrade(Long id);

    /**
     * 根据学生ID获取成绩列表
     * @param studentId 学生ID
     * @return 成绩列表
     */
    List<Grade> getGradeByStudentId(Long studentId);

    /**
     * 获取学生所有成绩
     * @param studentId 学生ID
     * @return 成绩列表
     */
    List<Grade> getStudentGrades(Long studentId);

    /**
     * 获取学生某学期的成绩
     * @param studentId 学生ID
     * @param semester 学期
     * @return 成绩列表
     */
    List<Grade> getStudentSemesterGrades(Long studentId, String semester);

    /**
     * 获取某门课程的所有成绩
     * @param courseName 课程名称
     * @return 成绩列表
     */
    List<Grade> getCourseGrades(String courseName);

    /**
     * 从Excel文件导入成绩
     * @param file Excel文件
     * @return 导入的记录数
     * @throws Exception 导入异常
     */
    int importGradesFromExcel(MultipartFile file) throws Exception;

    /**
     * 导出成绩到Excel
     * @param studentId 学生ID
     * @param semester 学期
     * @param courseName 课程名称
     * @return Excel文件的字节数组
     */
    byte[] exportGradesToExcel(Long studentId, String semester, String courseName);

    /**
     * 分页查询成绩列表
     * @param className 班级名称
     * @param courseName 课程名称
     * @param semester 学期
     * @param page 页码
     * @param size 每页大小
     * @return 分页后的成绩学生视图对象
     */
    Page<GradeStudentVO> listGrades(String className, String courseName, String semester, int page, int size);

    /**
     * 获取所有可选项（如班级、课程、学期等）
     * @return 选项映射
     */
    Map<String, List<String>> getOptions();

    /**
     * 批量更新成绩
     * @param param 更新参数
     * @return 更新是否成功
     */
    Boolean updateBatch(GradeUpdateParam param);

    /**
     * 获取当前用户可见的选项
     * @param request HTTP请求
     * @return 选项映射
     */
    Map<String, List<String>> getOptionsByCurrentUser(HttpServletRequest request);

    /**
     * 获取当前学生的成绩
     * @param request HTTP请求
     * @return 成绩列表
     */
    List<Grade> getCurrentStudentGrade(GradeQueryDTO queryDTO,HttpServletRequest request);
}